package version2;

import lombok.*;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Comparable<Student>{

    private String name;
    private int age;


    //重写hashCode方法，建立Student对象的hash值算法内容。 通过学生对象特有数据姓名和年龄值来算出hash值。
    @Override
    public int hashCode() {
        final int NUMBER = 31;
        return this.getName().hashCode() + this.getAge() * NUMBER;
    }
    
    /**
     * 重写Student对象的equals方法，同姓名同年龄就认为是同一个人
     * 
     * @param obj 要比较的对象
     * @return 是否相等
     */
    @Override
    public boolean equals(Object obj) {
        //System.out.println("equals");
        if(this == obj){
            return true;
        }
        if(!(obj instanceof Student)){
            throw new ClassCastException(obj+"类型不正确");
        }

        Student student = (Student)obj;
        // 同姓名同年龄就认为是同一个人
        return this.getName().equals(student.getName()) && this.getAge() == student.getAge();
    }
    
    // 让Student继承了Comparable接口之后，Student就具备了自然排序的能力，
    // 至于如何进行自然排序，就需要我们在类中的compareTo方法中进行实现。
    // 按照Student年龄进行排序，当年龄相同时，再按照姓名进行排序(这就是Student对象的自然排序方法)
    @Override
    public int compareTo(Student o) {
        if(o == null){
            throw new NullPointerException();
        }
        int temp = this.getAge() - o.getAge();
        return temp == 0 ? this.getName().compareTo(o.getName()) : temp;
    }
}
